#ifndef MEDIATOR_HPP
#define MEDIATOR_HPP
/**
 * @file   mediator.hpp
 * @author Kimmo Luoma <kimmo@PHOTON3>
 * @date   Thu Oct 25 09:20:41 2012
 * 
 * @brief  Mediator that handles communication between 
 * different components
 * 
 * 
 */

#include "coin.hpp"
#include "shift.hpp"
#include "density_matrix.hpp"

class Imediator:virtual public RefBase{
public:
  typedef Ref<Imediator> ptr_t;
};

namespace QuantumWalk{
  template<typename T>
  class mediator:public Imediator{
  private:
    const matrix<T> coin_;
    const matrix<T> shift_;
    matrix<T> rho_;
    //const channel<T>& chan_;
    
  public:
    mediator(){};
    //mediator(density_matrix<T>& rho,coin<T>& c,shift<T> S_,
    //channel<T> chan);
    mediator(density_matrix<T>& rho,coin<T> c,
    	     shift<T> S_);
    mediator(const mediator<T>& m);
    void print();
    matrix<T>& rho();
    const matrix<T>& shift() const;
    const matrix<T>& coin() const;
    //mediator(density_matrix<T>& rho,coin<T>& c);
    //mediator(const mediator<T>& m);
    //mediator<T> operator=(const mediator<T>& m);
    //Default destructor is fine
  };
};

#endif
